/*
 * GeoSystem.h
 *
 *  Created on: 22 Aug 2011
 *      Author: Allan
 */

#ifndef GEOSYSTEM_H_
#define GEOSYSTEM_H_

// C++ includes
#include <string>
#include <vector>
using namespace std;

// Eigen includes
#include <Eigen/Core>
using namespace Eigen;

// GeoReact includes
#include "Core/Multiphase.h"
#include "Core/ReactionSystem.h"

class GeoSystem
{
public:
	GeoSystem();
	
	GeoSystem(const Multiphase& multiphase, const ReactionSystem& eReactions);
	
	GeoSystem(const Multiphase& multiphase, const ReactionSystem& eReactions, const ReactionSystem& kReactions);
	
	void SetSpeciesPartition(const vector<string>& primarySpecies, const vector<string>& kineticSpecies);
	
	const Multiphase& GetMultiphase() const;
	
	const ReactionSystem& GetEquilibriumReactions() const;
	
	const ReactionSystem& GetKineticReactions() const;
	
	const vector<string>& GetPrimarySpecies() const;
	
	const vector<string>& GetEquilibriumSpecies() const;
	
	const vector<string>& GetKineticSpecies() const;
	
private:
	/// The multiphase object of the system
	Multiphase multiphase;
	
	/// The equilibrium--controlled reactions
	ReactionSystem eReactions;
	
	/// The kinetically-controlled reactions
	ReactionSystem kReactions;
	
	/// The primary, equilibrium and kinetic species
	vector<string> jSpecies, eSpecies, kSpecies;
};

ostream& operator<<(ostream& out, const GeoSystem& system);

#endif /* GEOSYSTEM_H_ */
